package com.example.demo.thread.finals.safelist;

import java.util.ArrayList;
import java.util.Collections;
import java.util.List;

/**
 * 如果类中存在数据或集合，在提供给外部访问之间需要做防御性复制
 * return Collections.unmodifiableList(new ArrayList<>(data));
 *
 * DefensiveReplicaDemo类中有一个List<Integer>类型的数据，使用了final关键字修饰，其中数据内容为1，2，3(构造函数添加进去的)。并且提供了一个getData()的方法。
 * 注意看红框内的代码，调用了data.add(4)，因为返回的是一个引用，指向的对象和DefensiveReplicaDemo类中的data指向的对象是同一个，
 * 这样就会导致DefensiveReplicaDemo类中的data数据内容改变为1，2，3，4。 为了避免这种情况，我们通常会做防御性复制，如图
 *
 * @author luowj12
 * @since 2021/6/30 17:08
 */
public final class DefensiveReplicaDemo {

    private final List<Integer> data = new ArrayList<>();

    public DefensiveReplicaDemo(){
        data.add(1);
        data.add(2);
        data.add(3);
    }

    public List<Integer> getData(){
        //return data;
        return Collections.unmodifiableList(new ArrayList<>(data));
    }

    public static void main(String[] args) {
        DefensiveReplicaDemo defensiveReplicaDemo = new DefensiveReplicaDemo();
        List<Integer> data = defensiveReplicaDemo.getData();
        //data.add(4);
        System.out.println(data.size());
    }

}
